
//
//  XYXEmoticonManager.swift
//  Emoticon
//
//  Created by 亚杏 on 2017/6/5.
//  Copyright © 2017年 oms. All rights reserved.
//

import UIKit

class XYXEmoticonManager {

    // 为了便于表情的复用，建立一个单例，只加载一次表情数据
    static let shared = XYXEmoticonManager()

    lazy var packages = [XYXEmoticonPackage]()

    //构造函数 - 如果在init前加private，可以要求调用者只能通过shared来访问对象
    // OC里重写 allocWithZone 方法才能锁住
    private init() {

        loadPackage()
    }

    //MARK:从bundle中加载数组
   private func loadPackage () {
        guard let path = Bundle.main.path(forResource: "HMEmoticon.bundle", ofType: nil),
            let bundle = Bundle(path: path),
            let plistPath = bundle.path(forResource: "emoticons.plist", ofType: nil),
            let array = NSArray(contentsOfFile: plistPath) as? [[String: String]],
            let modelPackage = NSArray.yy_modelArray(with: XYXEmoticonPackage.self, json: array) as? [XYXEmoticonPackage]
        else{
            return
        }

    //设置表情包数据,使用 + 不会分配空间，直接追加数据
    packages += modelPackage

    }

}


//MARK: - 根据string 在所有的表情符号中查找对应的表情模型对象
extension XYXEmoticonManager {

    /// 根据string 在所有的表情符号中查找对应的表情模型对象
    /// 如果找到，就返回表情模型，否则返回nil
    func findEmoticon(string: String) -> XYXEmoticonModel? {
        //1.遍历表情包
        for p in packages {
            //2. 在表情数组中过滤 string
            //方法一
            //         let result = p.emoticons.filter({ (em) -> Bool in
            //                return em.chs == string
            //            })

            //方法二，尾随闭包
            //            let result = p.emoticons.filter(){ (em) -> Bool in
            //                return em.chs == string
            //            }

            // 方法三，如果闭包中只有一句代码，且是返回
            // 闭包格式可省略
            // 参数省略后，使用 $0, $1... 依次替代原有的参数
            // return 也可省略
            let result = p.emoticons.filter(){
                $0.chs == string
            }

            //判断结果数组的数量
            if result.count == 1 {
                return result[0]
            }
        }
        return nil
    }

}

//MARK: - 表情字符串的处理
extension XYXEmoticonManager {
    /// 将给定的字符串转换成属性文本
    /// - Parameter string:  完整的字符串
    /// - Returns: 属性文本
    func emoticonStringToAttrStr(string: String, font: UIFont) -> NSAttributedString {
        let attrString = NSMutableAttributedString(string: string)

        //1. 建立正则表达式，过滤所有表情文字,[]需要加双斜线转义
        let pattern = "\\[.*?\\]"
        guard let regx = try? NSRegularExpression(pattern: pattern, options: []) else{
            return attrString
        }

        //2. 匹配所有项
        let matches = regx.matches(in: string, options: [], range: NSRange(location: 0, length: attrString.length))

        //3. 遍历所有的匹配结果
        for m in matches.reversed() {
            let r = m.rangeAt(0)
            let subStr = (attrString.string as NSString).substring(with: r)

            //            print(subStr)

            // 1> 使用 subStr 查找对应的表情符号模型
            if let em = XYXEmoticonManager.shared.findEmoticon(string: subStr){
                // 2> 使用表情符号中的imageName，替换原有的属性文本
                attrString.replaceCharacters(in: r, with: (em.imageText(font: font)))
            }


        }

        //统一设置一遍字符串的属性
        attrString.addAttributes([NSFontAttributeName: font], range: NSRange(location: 0, length: attrString.length))
        
        return attrString
    }


}



